/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package vigas.componentes;

import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.swing.JPanel;
import vigas.util.ComparadorDePontos;

/**
 *
 * @author Lidiany
 */
public class Viga {

   
    private List<Point> pontosDaViga = new ArrayList<Point>();
    private boolean podeMostrar1 = false;
    private boolean podeMostrar2 = false;
    private Point aa;
    private Point bb;

    //desenhar uma reta!
    public Viga() {
    }

    public void desenharViga(Graphics g, Point p1, Point p2, boolean horizontal) {


        Point a = getMaiorPonto(p1, p2);
        Point b = getMenorPonto(p1, p2);

        if (horizontal) {
            
            if (pontosDaViga.size() >= 1) {
                a.y = pontosDaViga.get(0).y;
                b.y = pontosDaViga.get(0).y;
            }             
        }

           pontosDaViga.add(a);
           pontosDaViga.add(b);

         
        Collections.sort(pontosDaViga, new ComparadorDePontos());
        
        desenharViga(g, horizontal);


    }
    
    public void mostrarComprimento(Graphics g, Point p1, Point p2, boolean horizontal) {

         Graphics2D g2d = (Graphics2D) g.create();


        Point b = getMaiorPonto(p1, p2);
        Point a = getMenorPonto(p1, p2);
        
        
        if (horizontal) {
            
            if (pontosDaViga.size() >= 1) {
                
                a.y = pontosDaViga.get(0).y;
                b.y = pontosDaViga.get(0).y;
                
                //confere se ponto clicado 1 pertence à viga
                for (int i = 0; i < pontosDaViga.size(); i++) {
                    if (pontosSaoProximos(a, pontosDaViga.get(i))) {
                        a = pontosDaViga.get(i);  
                        podeMostrar1 = true;
                    }        
                 }     
                
                //confere se ponto clicado 2 pertence à viga
                for (int i = 0; i < pontosDaViga.size(); i++) {
                    if (pontosSaoProximos(b, pontosDaViga.get(i))) {
                        b = pontosDaViga.get(i);    
                        podeMostrar2 = true;
                    }        
                 } 
                
                //se algum dos pontos não pertence à viga, retorna
                if(!podeMostrar1 || !podeMostrar2) {
                    return;
                }

                
        }

            aa = a;
            bb = b;
    
        mostrarComprimento(g);
        
        }
    }

    private boolean pontosSaoProximos(Point p1, Point p2) {

        if ((Math.abs(p2.x - p1.x) <= 8) && (Math.abs(p2.y - p1.y) <= 8)) {
            return true;
        }
        return false;
    }

  

    private Point getMaiorPonto(Point p1, Point p2) {
        if (p1.x > p2.x) {
            return p1;
        } else {
            return p2;
        }
    }

    private Point getMenorPonto(Point p1, Point p2) {
        if (p1.x < p2.x) {
            return p1;
        } else {
            return p2;
        }
    }

    /**
    Retorna o comprimento em pixels
     */
    public int getQtdDePontos() {
        int qtdePontos = pontosDaViga.size();
        Point p0 = pontosDaViga.get(0);
        Point p1 = pontosDaViga.get(qtdePontos - 1);
        return p1.x - p0.x;
    }

     /**
    Retorna o comprimento da viga em metros 
     */
    public float comprimentoEmMetros() {
        
        int qtdePontos = pontosDaViga.size();
        Point p0 = pontosDaViga.get(0);
        Point p1 = pontosDaViga.get(qtdePontos - 1);
        return (float)(p1.x - p0.x) / 100;
       
    }

    public void desenharViga(Graphics g,  boolean horizontal) {
        Graphics2D g2d = (Graphics2D) g.create();
        //jp.paintComponents(g);
        for (int i = 1; i < pontosDaViga.size(); i++) {
            Point pa = pontosDaViga.get(i - 1);
            Point pb = pontosDaViga.get(i);
           
            
            if(horizontal)
                g2d.fillRect(pa.x+1, pa.y+2, pb.x - pa.x, 4);
            else
                g2d.drawLine(pa.x+2, pa.y+1, pb.x, pb.y+1);

        }
        int x1 = pontosDaViga.get(0).x;
        int x2 = pontosDaViga.get(pontosDaViga.size()-1).x;

        
//        g2d.setColor(Color.red);
//        g2d.drawString("L = "+this.comprimentoEmMetros()+"m", ((x2+x1)/2) , pontosDaViga.get(0).y+20);
//        g2d.dispose();
    }

    public void mostrarComprimento(Graphics g) {
        Graphics2D g2d = (Graphics2D) g.create();

        int x1 = aa.x;
        int x2 = bb.x;

       
        float c =  (float)(x2 - x1) / 100;

        g2d.setColor(Color.red);
        g2d.drawString("L = "+this.comprimentoEmMetros()+"m", ((x2+x1)/2) , pontosDaViga.get(0).y+20);
        g2d.dispose();
        
    }


    public List<Point> getPontosDaViga() {
        return pontosDaViga;
    }

    public int getInicio(){
        return pontosDaViga.get(0).x;
    }

    public int getFim(){
        return pontosDaViga.get(pontosDaViga.size() - 1).x;
    }
    
}
